package com.smart.community.region.entity;

import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.smart.community.commons.enums.SystemStatusEnum;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;

/**
 * 楼栋实体类
 * 
 * @author Wu.Liang
 * @since 2024-12-21
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("sc_building")
public class Building implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 楼栋ID
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;

    /**
     * 楼栋编号
     */
    @TableField("building_no")
    private String buildingNo;

    /**
     * 楼栋名称
     */
    @TableField("building_name")
    private String buildingName;

    /**
     * 所属社区ID
     */
    @TableField("community_id")
    private Long communityId;



    /**
     * 楼栋类型：存储中文建筑类型名称，如"住宅楼"、"商业楼"、"办公楼"、"综合楼"
     */
    @TableField("building_type")
    private String buildingType;

    /**
     * 结构类型：1-框架，2-剪力墙，3-砖混，4-钢结构
     */
    @TableField("structure_type")
    private Integer structureType;

    /**
     * 楼层数
     */
    @TableField("floor_count")
    private Integer floorCount;

    /**
     * 地下层数
     */
    @TableField("underground_floor")
    private Integer undergroundFloor;

    /**
     * 单元数
     */
    @TableField("unit_count")
    private Integer unitCount;

    /**
     * 房户数量
     */
    @TableField("household_count")
    private Integer householdCount;

    /**
     * 每层户数
     */
    @TableField("units_per_floor")
    private Integer unitsPerFloor;

    /**
     * 是否有电梯：0-无，1-有
     */
    @TableField("has_elevator")
    private Integer hasElevator;

    /**
     * 电梯数量
     */
    @TableField("elevator_count")
    private Integer elevatorCount;

    /**
     * 建成年份
     */
    @TableField("build_year")
    private Integer buildYear;

    /**
     * 竣工日期
     */
    @TableField("completion_date")
    private LocalDate completionDate;

    /**
     * 建筑面积（平方米）
     */
    @TableField("area")
    private BigDecimal area;

    /**
     * 占地面积（平方米）
     */
    @TableField("land_area")
    private BigDecimal landArea;

    /**
     * 建筑高度（米）
     */
    @TableField("building_height")
    private BigDecimal buildingHeight;

    /**
     * 详细地址
     */
    @TableField("address")
    private String address;

    /**
     * 纬度
     */
    @TableField("latitude")
    private BigDecimal latitude;

    /**
     * 经度
     */
    @TableField("longitude")
    private BigDecimal longitude;

    /**
     * 楼栋管理员ID
     */
    @TableField("manager_id")
    private Long managerId;

    /**
     * 维护公司
     */
    @TableField("maintenance_company")
    private String maintenanceCompany;

    /**
     * 配套设施（JSON格式）
     */
    @TableField("facilities")
    private String facilities;

    /**
     * 楼栋图片（JSON数组）
     */
    @TableField("images")
    private String images;

    /**
     * 状态：0-禁用，1-启用
     */
    @TableField("status")
    private Integer status;

    /**
     * 排序字段
     */
    @TableField("sort_order")
    private Integer sortOrder;

    /**
     * 备注
     */
    @TableField("remark")
    private String remark;

    /**
     * 逻辑删除：0-未删除，1-已删除
     */
    @TableLogic
    @TableField("deleted")
    private Integer deleted;

    /**
     * 版本号
     */
    @Version
    @TableField("version")
    private Integer version = 1;

    /**
     * 创建人ID
     */
    @TableField("create_by")
    private Long createBy;

    /**
     * 创建时间
     */
    @TableField(value = "create_time", fill = FieldFill.INSERT)
    private LocalDateTime createTime;

    /**
     * 更新人ID
     */
    @TableField("update_by")
    private Long updateBy;

    /**
     * 更新时间
     */
    @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;

    // ==================== 业务方法 ====================

    /**
     * 获取状态文本
     */
    @JsonIgnore
    public String getStatusDesc() {
        return SystemStatusEnum.isEnabled(status) ? "启用" : "禁用";
    }

    /**
     * 获取楼栋类型文本
     */
    @JsonIgnore
    public String getBuildingTypeText() {
        if (buildingType == null) {
            return "未知";
        }
        return buildingType;
    }

    /**
     * 获取结构类型文本
     */
    @JsonIgnore
    public String getStructureTypeText() {
        if (structureType == null) {
            return "未知";
        }
        switch (structureType) {
            case 1:
                return "框架";
            case 2:
                return "剪力墙";
            case 3:
                return "砖混";
            case 4:
                return "钢结构";
            default:
                return "未知";
        }
    }

    /**
     * 获取电梯状态文本
     */
    @JsonIgnore
    public String getElevatorStatusText() {
        if (hasElevator == null) {
            return "未知";
        }
        return hasElevator == 1 ? "有电梯" : "无电梯";
    }

    /**
     * 获取楼栋类型（根据楼层数判断）
     */
    @JsonIgnore
    public String getBuildingTypeByFloor() {
        if (floorCount == null || floorCount == 0) {
            return null;
        }
        if (floorCount <= 6) {
            return "多层住宅";
        } else if (floorCount <= 18) {
            return "小高层";
        } else if (floorCount <= 33) {
            return "高层住宅";
        } else {
            return "超高层";
        }
    }

    /**
     * 计算楼龄
     */
    @JsonIgnore
    public Integer getBuildingAge() {
        if (buildYear == null) {
            return null;
        }
        return LocalDateTime.now().getYear() - buildYear;
    }

    /**
     * 计算平均每层房户数
     */
    @JsonIgnore
    public Integer getAverageHouseholdPerFloor() {
        if (floorCount == null || floorCount == 0) {
            return 0;
        }
        if (householdCount == null) {
            return 0;
        }
        return householdCount / floorCount;
    }
} 